package com.example.shuiyin.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.shuiyin.dto.FileDto;
import com.example.shuiyin.dto.FileInfoDTO;
import com.example.shuiyin.entity.FileInfo;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 文件管理服务
 */
public interface FileService {

    /**
     * 上传文件
     *
     * @param file 文件
     * @param type 文件类型
     * @param userId 用户ID
     * @return 文件信息
     * @throws IOException 操作异常
     */
    FileInfoDTO uploadFile(MultipartFile file, String type, Long userId) throws IOException;

    /**
     * 获取文件信息
     */
    FileInfo getFileInfo(String fileId);

    /**
     * 删除文件
     */
    boolean deleteFile(String fileId, Long userId);

    /**
     * 获取用户文件列表
     */
    Page<FileDto> getUserFiles(Long userId, int page, int size);

    /**
     * 清理过期文件
     */
    int cleanupOldFiles(int days);

    /**
     * 标记文件为已删除
     */
    boolean markAsDeleted(String fileId, Long userId);

    /**
     * 将文件转换为DTO
     */
    FileInfoDTO convertToDto(FileInfo fileInfo);

    /**
     * 保存文件信息
     */
    void saveFileInfo(FileInfo fileInfo);

    /**
     * 获取文件信息
     */
    FileDto getFileById(String fileId, Long userId);

    /**
     * 更新文件状态
     */
    boolean updateFileStatus(String fileId, String status, Long userId);

    /**
     * 清理测试文件元数据
     * @param prefix 文件路径前缀
     * @return 清理的记录数量
     */
    int cleanupTestFileMetadata(String prefix);

    /**
     * 重新计算用户的存储配额
     * @param userId 用户ID
     */
    void recalculateUserQuota(Long userId);

    /**
     * 批量删除文件
     * @param fileIds 文件ID列表
     * @param userId 用户ID
     * @return 成功删除的文件数量
     */
    int batchDeleteFiles(List<String> fileIds, Long userId);

    /**
     * 获取用户文件列表
     */
    List<FileInfoDTO> listFiles(Long userId, String status, int page, int size);

    /**
     * 检查用户存储空间
     */
    boolean checkStorageSpace(Long userId, long fileSize);

    /**
     * 验证文件的所有权
     * 
     * @param fileId 文件ID
     * @param userId 用户ID
     * @throws AppException 如果用户不是文件的拥有者，抛出FORBIDDEN异常
     */
    void verifyFileOwnership(String fileId, Long userId);
} 